package com.junmoo.www.advice;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
/**
 * 在完成了引入AOP依赖包后，一般来说并不需要去做其他配置。
 * 也许在Spring中使用过注解配置方式的人会问是否需要在程序主类中增加@EnableAspectJAutoProxy来启用，实际并不需要。
 *
 * 可以看下面关于AOP的默认配置属性，其中spring.aop.auto属性默认是开启的，
 * 也就是说只要引入了AOP依赖后，默认已经增加了@EnableAspectJAutoProxy
 */
@Aspect
@Component
@Slf4j
public class WebLogAspect {
    // execution  @target  @within  @annotation @args
    @Pointcut("@within(org.springframework.web.bind.annotation.RequestMapping)")
    public void webLog(){}

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint)  {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        String servletPath= request.getServletPath();
        String method= request.getMethod();
        String parameters = JSON.toJSONString(request.getParameterMap());
        log.info("method = {} | uri = {} | requestBody = {}", method.toUpperCase(), servletPath, parameters);
    }

}
